/* 
 * Quechua - the lightweight data mining framework
 *
 * Copyright (C) 2012 Marek Denis <quechua@octogan.net>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "../include/interface-processor.h"

Processor::Processor() : internal(new(std::nothrow) Internal) {
    init();
}

void Processor::init() {
    if(!internal) {
        LOG(CRITIC) << "Processor::internal is not initialized, exiting";
        return;
    }
    internal->type = PROCESSOR;
};

bool Processor::prepare() { 
    return true; 
};

bool Processor::reset() {
    return true;
}

bool Processor::stop() {
    return true;
};

bool Processor::load_misc_conf(const setting_t& misc) {
    return true;
};

Processor::~Processor() {
    LOG(INFO) << "Destroying Processor " << internal->name;
    if(internal)
        delete internal;
}

datapack_ptr serve_processor(datapack_ptr data, void* object, STEP step) {
    Processor * const processor = reinterpret_cast<Processor* const >(object);
    datapack_ptr processing_result;

    try {

         if(step==PREPROCESSING) { 
            processing_result = processor->preprocess(data);
         }
         else if(step==POSTPROCESSING) {
            processing_result =  processor->postprocess(data);
         } 
         else { // this should never happen!
             LOG(CRITIC) << "Trying to serve processor object in a separated thread "
                         << "while step is " << step << ", exiting from processor serving";
             return processing_result;
         }

    } catch (std::bad_cast& ex) {
         LOG(ERROR) << "While running Processor method, bad cast occured, probably DataPack is not what Processor expected to be";
    }

    processing_result->pass_stamp(data);
    return processing_result;
};

